package net.mysoft.framework.util;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;

import net.mysoft.framework.model.ZipInfo;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
 * zip压缩器工具类	
 * 
 * @author liuyang
 *	
 */
public class ZipCompressor {
	static final int BUFFER = 8192;  
	
	private ZipCompressor(){
		
	}
	
	public static void compress(String srcPathName,String zipFilePath) {  
	     File file = new File(srcPathName);  
	     File zipFile = new File(zipFilePath);  
	     if (!file.exists())  
	         throw new RuntimeException(srcPathName + "不存在！");  
	     try {  
	    	 FileOutputStream fileOutputStream = new FileOutputStream(zipFile);  
	    	 CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());  
	    	 ZipOutputStream out = new ZipOutputStream(cos);  
	    	 String basedir = "";  
	    	 compress(file, out, basedir);  
	    	 out.close();  
	     } catch (Exception e) {  
	    	 throw new RuntimeException(e);  
	     }  
	}  
	    
	private static void compress(File file, ZipOutputStream out, String basedir) {  
		/* 判断是目录还是文件 */  
		if (file.isDirectory()) {  
			//System.out.println("压缩：" + basedir + file.getName());  
			ZipCompressor.compressDirectory(file, out, basedir);  
		} else {  
			//System.out.println("压缩：" + basedir + file.getName());  
			ZipCompressor.compressFile(file, out, basedir);  
		}  
	}  
	    
	/** 压缩一个目录 */  
	private static void compressDirectory(File dir, ZipOutputStream out, String basedir) {  
		if (!dir.exists())  
			return;  
		File[] files = dir.listFiles();  
		for (int i = 0; i < files.length; i++) {  
			/* 递归 */  
			compress(files[i], out, basedir + dir.getName() + "/");  
		}  
	}  
	    
	/** 压缩一个文件 */  
	private static void compressFile(File file, ZipOutputStream out, String basedir) {  
		if (!file.exists()) {  
			return;  
		}  
		try {  
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));  
			ZipEntry entry = new ZipEntry(basedir + file.getName());  
			out.putNextEntry(entry);  
			int count;  
			byte data[] = new byte[BUFFER];  
			while ((count = bis.read(data, 0, BUFFER)) != -1) {  
				out.write(data, 0, count);  
			}  
			bis.close();  
		} catch (Exception e) {  
			throw new RuntimeException(e);  
		}  
	}  
	/** 压缩一个List<ZipInfo> 返回一个byte[]*/  
	public static byte[] compressbyteList(List<ZipInfo> files) {  
		ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
		try{
			CheckedOutputStream cos = new CheckedOutputStream(byteArrayOut,new CRC32());  
			ZipOutputStream out = new ZipOutputStream(cos); 
			out.setEncoding("utf-8");
			for(ZipInfo zipInfo : files) {
				BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(zipInfo.getFileBuf()));  
				ZipEntry entry = new ZipEntry(zipInfo.getFileName()); 
				out.putNextEntry(entry);
				int count;  
				byte data[] = new byte[BUFFER];  
				while ((count = bis.read(data, 0, BUFFER)) != -1) { 
					out.write(data, 0, count);  
				}  
			}
			out.finish();
		}catch(Exception e) {
			throw new RuntimeException(e);
		}
		return byteArrayOut.toByteArray();
	} 
	
	public static void main(String[] args) throws UnsupportedEncodingException{
		ZipCompressor.compress("F:/Workspaces/dagongcredit/src/main/resources/process/RenWuSH","F:/Workspaces/dagongcredit/src/main/resources/process/RenWuSH.zip");
		
	}
}
